package com.atwisdom.star.core.dao.pojo.functionClass;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.atwisdom.star.common.typeHandler.MyFastjsonTypeHandler;
import com.atwisdom.star.core.dao.pojo.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 *
 * @TableName api_config
 */
@TableName(value ="api_config",autoResultMap = true)
@Data
public class ApiConfig extends BaseEntity {
    /**
     * 主键标识
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 第三方系统名称
     */
    @TableField(value = "sysName")
    private String sysName;

    /**
     * 第三方系统名称
     */
    @TableField(value = "name")
    private String name;

    /**
     * 接口服务名
     */
    @TableField(value = "serviceName")
    private String serviceName;

    /**
     * 操作:更新、插入、删除、作废等
     */
    @TableField(value = "opType")
    private String opType;

    /**
     * 主体模型
     */
    @TableField(value = "model")
    private String model;


    /**
     * 主体类
     */
    @TableField(value = "className")
    private String className;

    /**
     * 主体类字段配置
     */
    @TableField(value = "fieldNames",typeHandler = MyFastjsonTypeHandler.class)
    private JSONObject fieldNames;

    /**
     * 属性配置
     */
    @TableField(value = "config",typeHandler = MyFastjsonTypeHandler.class)
    private JSONArray config;

    /**
     * 是否可用
     */
    @TableField(value = "enable")
    private Boolean enable;

    /**
     * 说明
     */
    @TableField(value = "comments")
    private String comments;



    @TableField(exist = false)
    private static final long serialVersionUID = 1L;

    public ApiConfig(){

    }

    /**
     * 有参构造方法
     *
     * @param jsonObject 参数
     */
    public ApiConfig(JSONObject jsonObject) {
        Set<String> keys = jsonObject.keySet();
        this.id = keys.contains("id") ? jsonObject.getLong("id") : null;
        this.sysName = jsonObject.getString("sysName");
        this.name = jsonObject.getString("name");
        this.serviceName = keys.contains("serviceName") ? jsonObject.getString("serviceName") : null;
        this.opType = keys.contains("opType") ? jsonObject.getString("opType") : null;
        this.model = keys.contains("model") ? jsonObject.getString("model") : null;
        this.className = keys.contains("className") ? jsonObject.getString("className") : null;
        this.fieldNames = keys.contains("fieldNames") ? jsonObject.getJSONObject("fieldNames") : null;
        this.config = keys.contains("config") ? jsonObject.getJSONArray("config"):null;
        this.enable = keys.contains("enable") ? jsonObject.getBoolean("enable"):null;
        this.comments = keys.contains("comments") ? jsonObject.getString("comments") : null;
    }


    /**
     * 获取摘要数据列
     *
     * @return 反回查询列
     */
    public static String[] fetchSimpleColumns() {
        List<String> columns = new ArrayList<>();
        columns.add("id");
        columns.add("sysName");
        columns.add("name");
        columns.add("serviceName");
        columns.add("opType");
        columns.add("model");
        columns.add("className");
        columns.add("enable");
        columns.add("updatedBy");
        columns.add("updateTime");
        columns.add("createdBy");
        columns.add("createTime");
        return columns.toArray(new String[0]);
    }

    /**
     * 将当前模型对象转成jsonObject
     *
     * @return 返回结果
     */
    public JSONObject fetchJsonObject() {
        JSONObject JsonObject = new JSONObject();
        JsonObject.put("id", this.id);
        JsonObject.put("sysName", this.sysName);
        JsonObject.put("name", this.name);
        JsonObject.put("serviceName", this.serviceName);
        JsonObject.put("opType", this.opType);
        JsonObject.put("model", this.model);
        JsonObject.put("className", this.className);
        JsonObject.put("fieldNames", this.fieldNames);
        JsonObject.put("config", this.config);
        JsonObject.put("enable", this.enable);
        JsonObject.put("comments", this.comments);
        JsonObject.put("createdBy", this.createdBy);
        JsonObject.put("createTime", this.createTime);
        JsonObject.put("updatedBy", this.updatedBy);
        JsonObject.put("updateTime", this.updateTime);
        return JsonObject;
    }
}